package com.gitee.devinx3.mgt.gateway;

import com.gitee.devinx3.mgt.util.FilterUtils;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class TrackingFilter extends ZuulFilter {

    private static final int FILTER_ORDER = 1;
    private static final boolean SHOULD_FILTER = true;
    private static final Logger logger = LoggerFactory.getLogger(TrackingFilter.class);

    @Autowired
    private FilterUtils filterUtils;

    // filterType()方法告诉 Zuul 过滤器是一个前置，路 由或后置过滤器。
    @Override
    public String filterType() {
        return FilterUtils.PRE_FILTER_TYPE;
    }

    // filterOrder()方法返回一个整型值表示 Zuul 应该通过不同 的过滤器类型发送请求的顺序。
    @Override
    public int filterOrder() {
        return FILTER_ORDER;
    }

    // shouldFilter()方法返回一个布尔值，表示过滤 器是否应该处于活动状态。
    public boolean shouldFilter() {
        return SHOULD_FILTER;
    }

    private boolean isCorrelationIdPresent() {
        if (filterUtils.getCorrelationId() != null) {
            return true;
        }
        return false;
    }

    private String generateCorrelationId() {
        return java.util.UUID.randomUUID().toString();
    }

    // 包含过滤器将实现的业务逻辑。
    @Override
    public Object run() {
        /**
         每一次服务通过过滤器被执行。
         在 run() 方法中，你看看 tmxcorrelation-id 是否存在，
         如果不存在，你生成一个相关值并将其设置在 HTTP 的 tmx-correlation-id
         */
        if (isCorrelationIdPresent()) {
            logger.debug("tmx-correlation-id found in tracking filter: {}. ", filterUtils.getCorrelationId());
        } else {
            filterUtils.setCorrelationId(generateCorrelationId());
            logger.debug("tmx-correlation-id generated in tracking filter: {}.", filterUtils.getCorrelationId());
        }

        RequestContext ctx = RequestContext.getCurrentContext();
        logger.debug("Processing incoming request for {}.", ctx.getRequest().getRequestURI());
        return null;
    }

}
